import { ref, computed, onMounted, onUnmounted } from 'vue'
import { ctpService } from '@/services/ctpService'

/**
 * 每日持仓跟踪器 Composable
 * 负责跟踪每日撤单数量(cPosition)和成交次数(tPosition)
 * 交易日周期：头天晚上9点到第二天下午3点
 * 支持按合约进行数据隔离
 */
export function useDailyPositionTracker(contractCode = 'global') {
  // 每日数据状态 - 按合约隔离
  const cPosition = ref(0) // 每日挂/撤单操作次数
  const tPosition = ref(0) // 每日成交次数
  const currentTradingDay = ref(null) // 当前交易日
  const lastResetTime = ref(null) // 上次重置时间

  // 存储键名 - 包含合约代码以实现隔离
  const STORAGE_KEY_C = `daily_cancel_position_${contractCode}`
  const STORAGE_KEY_T = `daily_trade_position_${contractCode}`
  const STORAGE_KEY_TRADING_DAY = `current_trading_day_${contractCode}`
  const STORAGE_KEY_RESET_TIME = `last_reset_time_${contractCode}`

  /**
   * 获取当前交易日
   * 交易日规则：晚上9点之前算前一天，9点之后算当天
   */
  const getCurrentTradingDay = () => {
    const now = new Date()
    const hour = now.getHours()

    // 如果是晚上9点之前，算前一天的交易日
    if (hour < 21) {
      const yesterday = new Date(now)
      yesterday.setDate(yesterday.getDate() - 1)
      return yesterday.toDateString()
    } else {
      return now.toDateString()
    }
  }

  /**
   * 检查是否需要重置每日数据
   * 重置时间：每天下午3点
   */
  const checkAndResetDaily = () => {
    const now = new Date()
    const hour = now.getHours()
    const currentDay = getCurrentTradingDay()

    // 如果交易日发生变化，或者到了下午3点且还没重置过
    if (currentTradingDay.value !== currentDay) {
      resetDailyCounters()
      currentTradingDay.value = currentDay
      saveToStorage()
    } else if (hour >= 15 && hour < 21) {
      // 下午3点到晚上9点之间，检查是否已经重置过
      const lastReset = lastResetTime.value ? new Date(lastResetTime.value) : null
      const today = new Date()
      today.setHours(15, 0, 0, 0) // 今天下午3点

      if (!lastReset || lastReset < today) {
        resetDailyCounters()
        lastResetTime.value = now.toISOString()
        saveToStorage()
      }
    }
  }

  /**
   * 重置每日计数器
   */
  const resetDailyCounters = () => {
    cPosition.value = 0
    tPosition.value = 0
    lastResetTime.value = new Date().toISOString()
  }

  /**
   * 增加撤单计数 - 只统计当前合约的撤单  (包括挂单/撤单操作次数，不仅仅是撤单，名字暂时就叫cancelCount,)
   */
  const incrementCancelCount = (orderContractCode = null, count = 1) => {
    // 如果指定了合约代码，只有匹配当前合约时才计数
    if (orderContractCode && orderContractCode !== contractCode) {
      return
    }

    cPosition.value += count
    saveToStorage()
  }

  /**
   * 增加成交计数 - 只统计当前合约的成交
   */
  const incrementTradeCount = (tradeContractCode = null, count = 1) => {
    // 如果指定了合约代码，只有匹配当前合约时才计数
    if (tradeContractCode && tradeContractCode !== contractCode) {
      return
    }

    tPosition.value += count
    saveToStorage()
  }

  /**
   * 保存数据到本地存储
   */
  const saveToStorage = () => {
    try {
      localStorage.setItem(STORAGE_KEY_C, cPosition.value.toString())
      localStorage.setItem(STORAGE_KEY_T, tPosition.value.toString())
      localStorage.setItem(STORAGE_KEY_TRADING_DAY, currentTradingDay.value || '')
      localStorage.setItem(STORAGE_KEY_RESET_TIME, lastResetTime.value || '')
    } catch (error) {
    }
  }

  /**
   * 从本地存储加载数据
   */
  const loadFromStorage = () => {
    try {
      const savedC = localStorage.getItem(STORAGE_KEY_C)
      const savedT = localStorage.getItem(STORAGE_KEY_T)
      const savedTradingDay = localStorage.getItem(STORAGE_KEY_TRADING_DAY)
      const savedResetTime = localStorage.getItem(STORAGE_KEY_RESET_TIME)

      if (savedC !== null) cPosition.value = parseInt(savedC) || 0
      if (savedT !== null) tPosition.value = parseInt(savedT) || 0
      if (savedTradingDay) currentTradingDay.value = savedTradingDay
      if (savedResetTime) lastResetTime.value = savedResetTime

    } catch (error) {
    }
  }

  /**
   * 处理订单更新事件
   * 注意：这里不再自动计算撤单次数，因为需要区分手动撤单和自动撤单
   */
  const handleOrderUpdate = (orderUpdate) => {

    // 检查是否需要重置
    checkAndResetDaily()

    // 订单被撤销 (状态码 53 = 已撤销)
    if (orderUpdate.order_status === 53) {
      // 检查订单合约是否匹配
      const orderContractCode = orderUpdate.instrument_id
      if (orderContractCode === contractCode) {
      }
    }
  }

  /**
   * 处理成交通知事件
   */
  const handleTradeNotification = (tradeData) => {

    // 检查是否需要重置
    checkAndResetDaily()

    // 检查成交合约是否匹配当前合约
    const tradeContractCode = tradeData.instrument_id
    if (tradeContractCode === contractCode) {
      // 每次成交增加计数
      incrementTradeCount(tradeContractCode)
    } else {
    }
  }

  /**
   * 定时检查重置条件
   */
  let resetCheckInterval = null

  const startResetChecker = () => {
    // 每分钟检查一次是否需要重置
    resetCheckInterval = setInterval(() => {
      checkAndResetDaily()
    }, 60000) // 60秒

  }

  const stopResetChecker = () => {
    if (resetCheckInterval) {
      clearInterval(resetCheckInterval)
      resetCheckInterval = null
    }
  }

  /**
   * 获取交易日状态信息
   */
  const getTradingDayInfo = computed(() => {
    const now = new Date()
    const hour = now.getHours()
    const currentDay = getCurrentTradingDay()

    let status = ''
    if (hour >= 21 || hour < 3) {
      status = '夜盘交易时间'
    } else if (hour >= 9 && hour < 15) {
      status = '日盘交易时间'
    } else if (hour >= 15 && hour < 21) {
      status = '休市时间'
    } else {
      status = '凌晨时间'
    }

    return {
      currentTradingDay: currentDay,
      status,
      nextResetTime: '下午15:00',
      cPosition: cPosition.value,
      tPosition: tPosition.value
    }
  })

  // 组件挂载时初始化
  onMounted(() => {

    // 加载保存的数据
    loadFromStorage()

    // 检查是否需要重置
    checkAndResetDaily()

    // 启动定时检查器
    startResetChecker()

    // 监听CTP事件
    ctpService.on('order_update', handleOrderUpdate)
    ctpService.on('trade_notification', handleTradeNotification)

  })

  // 组件卸载时清理
  onUnmounted(() => {

    // 停止定时检查器
    stopResetChecker()

    // 取消事件监听
    ctpService.off('order_update', handleOrderUpdate)
    ctpService.off('trade_notification', handleTradeNotification)

    // 保存最终数据
    saveToStorage()
  })

  return {
    // 状态
    cPosition,           // 每日撤单数量
    tPosition,           // 每日成交次数
    currentTradingDay,   // 当前交易日
    // 计算属性
    getTradingDayInfo,   // 交易日信息
    // 方法
    incrementCancelCount,
    incrementTradeCount,
    resetDailyCounters,
    checkAndResetDaily,
    getCurrentTradingDay
  }
}
